from loguru import logger
from proxypool.storages.redis import RedisClient
from proxypool.setting import PROXY_NUMBER_MAX
from proxypool.crawlers import __all__ as crawlers_cls


class Getter(object):
    """
    getter of proxypool
    """
    
    def __init__(self):
        """
        init db and crawlers
        """
        self.redis = RedisClient()
        self.crawlers_cls = crawlers_cls
        self.crawlers = [crawler_cls() for crawler_cls in self.crawlers_cls]

    # 判断是否达到了代理池限制，是否已经达到了容量阈值
    def is_full(self):
        """
        if proxypool if full
        return: bool
        """
        # 调用了RedisClient的count()方法来获取代理的数量；
        # 如果不想加这个限制，可以将此方法永久返回True
        return self.redis.count() >= PROXY_NUMBER_MAX #代理池的最大数量

    @logger.catch
    def run(self):
        """
        run crawlers to get proxy
        :return:
        """
        # 该方法首先判断了代理池是否达到阈值
        # 调用了 RedisClient 的 count() 方法获取代理的数量，然后加以判断，如果数量达到阈值则返回 True，否则 False
        if self.is_full():
            return
        # "接下来定义了 run() 方法，首先判断了代理池是否达到阈值，然后在这里就调用了 Crawler 类的 CrawlFunc 属性，获取到所有以 crawl 开头的方法列表，依次通过 get_proxies() 方法调用，得到各个方法抓取到的代理，然后再利用 RedisClient 的 add() 方法加入数据库，这样获取模块的工作就完成了。"
        for crawler in self.crawlers:
            for proxy in crawler.crawl():
                self.redis.add(proxy)


if __name__ == '__main__':
    getter = Getter()
    getter.run()